package com.tlias.service.impl;

import com.tlias.entity.ClazzStudentCount;
import com.tlias.entity.EmpGenderCount;
import com.tlias.entity.EmpJobDataCount;
import com.tlias.entity.StudentAcademicCount;
import com.tlias.mapper.EmpMapper;
import com.tlias.mapper.ReportMapper;
import com.tlias.service.ReportService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@Service
public class ReportServiceImpl implements ReportService {
    // 使用@Autowired注解自动注入ReportMapper实例，用于操作报告相关的数据
    @Autowired
    private ReportMapper reportMapper;

    // 使用@Autowired注解自动注入EmpMapper实例，用于操作员工相关的数据
    @Autowired
    private EmpMapper empMapper;

    /**
     * 获取员工性别统计信息
     *
     * @return 返回一个包含员工性别统计信息的列表
     */
    @Override
    public List<EmpGenderCount> empGenderData() {
        // 调用reportMapper的empGenderData方法获取员工性别统计信息
        List<EmpGenderCount> stringList = reportMapper.empGenderData();
        return stringList;
    }

    /**
     * 获取学生学位统计信息
     *
     * @return 返回一个包含学生学位统计信息的列表
     */
    @Override
    public List<StudentAcademicCount> studentDegreeData() {
        // 调用reportMapper的studentDegreeData方法获取学生学位统计信息
        List<StudentAcademicCount> stringList = reportMapper.studentDegreeData();
        return stringList;
    }

    /**
     * 获取员工职位统计数据
     *
     * @return 返回一个包含员工职位统计数据的列表
     */
    @Override
    public EmpJobDataCount empJobData() {
        // 1. 从Mapper获取原始的行数据，现在是 List<Map> 格式
        List<Map<String, Object>> rowList = reportMapper.empJobData();

        // 2. 准备两个空的列表，用于分别存放职位名称和对应的人数
        List<String> jobNameList = new ArrayList<>();
        List<Integer> jobCountList = new ArrayList<>();

        // 3. 遍历从数据库查出的行列表
        for (Map<String, Object> row : rowList) {
            // 从Map中根据SQL别名("name", "value")取出数据
            String name = (String) row.get("name");

            // 注意：COUNT(*) 返回的类型可能是 Long，直接转 Integer 可能报错
            // 最安全的方式是先转为 Number，再取 intValue()
            Integer value = ((Number) row.get("value")).intValue();

            // 将取出的数据分别添加到两个列表中
            jobNameList.add(name);
            jobCountList.add(value);
        }

        // 4. 使用处理好的两个列表创建最终的返回对象
        // 将List转换为Array，并传入EmpJobDataCount的构造函数
        EmpJobDataCount finalResult = new EmpJobDataCount(
                jobNameList.toArray(new String[0]),
                jobCountList.toArray(new Integer[0])
        );

        return finalResult;
    }

    @Override
    public ClazzStudentCount studentCountData() {
        // 1. 从Mapper获取原始的行数据，现在是 List<Map> 格式
        List<Map<String, Object>> rowList1 = reportMapper.studentCountData();
        // 2. 准备两个空的列表，用于分别存放班级名称和每一个班级的人数
        List<String> clazzNameList = new ArrayList<>();
        List<Integer> clazzCountList = new ArrayList<>();
        // 3. 遍历从数据库查出的行列表
        for (Map<String, Object> row : rowList1) {
            String name = (String) row.get("clazzList");
            Integer value = ((Number) row.get("dataList")).intValue();
            clazzNameList.add(name);
            clazzCountList.add(value);
        }
        //  4. 使用处理好的两个列表创建最终的返回对象
        //  将List转换为Array，并传入ClazzStudentCount的构造函数
        ClazzStudentCount finalResult = new ClazzStudentCount(
                clazzNameList.toArray(new String[0]),
                clazzCountList.toArray(new Integer[0])
        );
        return finalResult;
    }
}
